package com.codes.core.utils.word;

import freemarker.cache.FileTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @Description //  $
 * @Date 2020/6/30 18:55
 * @Created by peanut
 */
public class WordTest {

    private static Configuration cfg = null;
    private static String DEFAULT_ENCODING = "UTF-8";
    private static final String templateFolder = WordUtils.class.getResource("/template/word").getPath();

    static {
        cfg = new Configuration();
        cfg.setDefaultEncoding(DEFAULT_ENCODING);
    }

    public static String buildStr(String tempDir, List<String> params) {
        String result = null;
        StringWriter sw = null;
        try {
            sw = new StringWriter();
            // 加载模板文件
            if (StringUtils.isBlank(tempDir)) {
                throw new RuntimeException("模板文件路径不能为空");
            }
            loadFileTemplate(tempDir);
            // 拼接word
            for (String param : params) {
                appendFtl(sw, param);
            }
            // 转string
            result = sw.toString();
        } catch (Exception ex) {
            throw dealException(ex);
        } finally {
            try {
                if (sw != null) {
                    sw.flush();
                    sw.close();
                }
            } catch (Exception ex) {
                // 暂不处理
            } finally {
                sw = null;
            }
        }
        return result;
    }

    /**
     * 创建word文件
     * @param destPath 生成文件全路径
     * @param tempDir ftl文件夹路径
     * @param params 文件名和文件替换参数
     */
    public static File buildWord(  String tempDir, List<String> params) {
        PrintWriter pw = null;
        tempDir  =  templateFolder;
        Writer w = null;
        // 创建文件路径
       // File file = new File("test.doc");
        File file = new File("D:\\dev_data\\dev_data\\doc\\test001.doc");
        try {
//            // 创建目标文件流
//            if (StringUtils.isBlank(destPath)) {
//                throw new RuntimeException("生成文件路径不能为空");
//            }

            if (!file.getParentFile().exists()) {
                if(!file.getParentFile().mkdirs()) {
                    throw new RuntimeException("创建文件路径失败");
                }
            }
            // 创建文件流
         //   pw = new PrintWriter( file, DEFAULT_ENCODING);
              w = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
            // 加载模板文件
            if (StringUtils.isBlank(tempDir)) {
                throw new RuntimeException("模板文件路径不能为空");
            }
            loadFileTemplate(tempDir);
            // 拼接word
            for (String param : params) {
                appendFtl(w, param);
            }
            w.flush();
        } catch (Exception ex) {
            throw dealException(ex);
        } finally {
            try {

                w.close();
                if (pw != null) {
                    pw.flush();
                    pw.close();
                }
            } catch (Exception ex) {
                // 暂不处理
            } finally {
                pw = null;
            }
        }
        return file;
    }

    /**
     * 拼接模板文件
     * @param pw
     * @param param
     */
    private static void appendFtl(Writer pw, String param) {
        try {
            // 读取模板文件
            Template template = cfg.getTemplate(param );
            // 写入文件
            Map<String,String> m = new HashMap<>(10);
            m.put("id","1001");
            template.process(m , pw);
        } catch (Exception ex) {
            throw dealException(ex);
        }
    }

    /**
     * 加载模板文件
     * @param
     */
    private static void loadFileTemplate(String tempDir) {
        try {
            // 加载模板文件
            FileTemplateLoader loader = new FileTemplateLoader(new File(tempDir));

            TemplateLoader[] loaders = { loader };

            MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);

            // 读取模板
            cfg.setTemplateLoader(mtl);
            cfg.setDefaultEncoding(DEFAULT_ENCODING);
        } catch (Exception ex) {
            throw dealException(ex);
        }
    }

    /**
     * 调用异常处理
     * @param ex
     * @return
     */
    private static RuntimeException dealException(Exception ex) {
        if (ex == null) {
            return null;
            //  } else if (ex instanceof AxisFault) {
            //   if (ex.getCause() instanceof SocketTimeoutException) { // 调用超时
            //    return new ServiceInterruptedException(ex.getCause());
            //   } else if (ex.getCause() instanceof ConnectTimeoutException) { // 连接超时
            //    // 暂不作特殊处理
            //    return new RuntimeException(ex);
            //   } else {
            //    return new RuntimeException(ex);
            //   }
        } else {
            return new RuntimeException(ex);
        }
    }

    public static void main(String[] args) {

//
//
//        Map<String, Object> map = new HashMap<String, Object>(16);
//        List<String> templates = new ArrayList<>(16);
//        String tplName = ""; // WordTplEnum.getLabelByCode(1);
//        String templateName = "";// tplName + ".ftl";
//        for (int i = 0; i < 4 ; i++) {
//            tplName = WordTplEnum.getLabelByCode(i+1);
//            templateName = tplName + ".ftl";
//            templates.add(templateName);
//        }
//        File words = WordTest.buildWord("test",templates);
//        if(words.getName().equals("test.doc")){
//            System.out.println("ok");
//        }else {
//            System.out.println("error");
//        }

    }

}